﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Windows.Input;
using DG.Common.Patterns.Commands;
using DG.Common.Patterns.MVVM;
using TCC.ControleFluxoDeCaixa.Model.Contas;
using TCC.ControleFluxoDeCaixa.Model.Entities;
using TCC.ControleFluxoDeCaixa.Model.Fluxo.Credito;
using TCC.ControleFluxoDeCaixa.Model.Fluxo.TranferenciaEntreContas;

namespace TCC.ControleFluxoDeCaixa.Apresentacao.ViewModels.Credito
{
    public class PagamentoFaturaWindowViewModel : ViewModelBase
    {
        private FaturaCreditoResumo _faturaCreditoResumo;
        private decimal _valor;
        private ContaFinanceiraBancaria _contaRemetente;
        private readonly FluxoDeCaixaContextFiltrado _context;
        private DateTime _data;
        private readonly bool _editar;

        public PagamentoFaturaWindowViewModel(FaturaCreditoResumo faturaCreditoResumo, FluxoDeCaixaContextFiltrado context)
        {
            _faturaCreditoResumo = faturaCreditoResumo;
            _context = context;
            if (_faturaCreditoResumo != null)
                _editar = _faturaCreditoResumo.Fatura != null;
                Valor = !_editar ? faturaCreditoResumo.Saldo : _faturaCreditoResumo.Fatura.Valor;
            ContaRemetente = faturaCreditoResumo.ContaCredito.ContaVinculada;
            Data = FaturaCreditoResumo.DataVencimento;
        }

        public FaturaCreditoResumo FaturaCreditoResumo
        {
            get { return _faturaCreditoResumo; }
            set
            {
                if (Equals(value, _faturaCreditoResumo)) return;
                _faturaCreditoResumo = value;
                OnPropertyChanged("FaturaCreditoResumo");
            }
        }

        public decimal Valor
        {
            get { return _valor; }
            set
            {
                if (value == _valor) return;
                _valor = value;
                OnPropertyChanged("Valor");
            }
        }

        public DateTime Data
        {
            get { return _data; }
            set
            {
                if (value.Equals(_data)) return;
                _data = value;
                OnPropertyChanged("Data");
            }
        }

        public ContaFinanceiraBancaria ContaRemetente
        {
            get { return _contaRemetente; }
            set
            {
                if (Equals(value, _contaRemetente)) return;
                _contaRemetente = value;
                OnPropertyChanged("ContaRemetente");
            }
        }

        public IEnumerable<ContaFinanceira> GetContasFinanceiras
        {
            get { return _context != null ? _context.ContaFinanceiras.OfType<ContaFinanceiraBancaria>().ToArray() : null; }
        }

        public ICommand QuitarFaturaCommand
        {
            get
            {
                return new FunctionalCommand(() =>
                {

                    if (_editar)
                    {
                        var fatura = _faturaCreditoResumo.Fatura;
                        var lancamentoEntrada = fatura.LancamentoPagamento;
                        var transferencia = _context.Transferencias
                            .Single(t => t.LancamentoEntrada.LancamentoId == lancamentoEntrada.LancamentoId);
                        var lancamentoSaida = transferencia.LancamentoSaida;

                        lancamentoEntrada.Movimentos.First().ValorAbsoluto = Valor;
                        lancamentoSaida.Movimentos.First().ValorAbsoluto = Valor;
                        lancamentoSaida.Movimentos.First().Conta = ContaRemetente;
                        transferencia.ContaRemetente = ContaRemetente;
                        fatura.Valor = Valor;
                        _context.SaveChanges();
                        SendMessage("Quitação modificada com sucesso");
                        RaiseFinished();

                    }
                    else
                    {
                        var categoria = _context.GetCategoriaTransferencia();
                        var transferencia = new TransferenciaEntreContas
                        {
                            ContaRemetente = ContaRemetente,
                            ContaDestinataria = _faturaCreditoResumo.ContaCredito,
                            Valor = Valor,
                            DataTransferencia = Data,
                            Usuario = ContaRemetente.Usuario
                        };

                        var lancamentoEntrada = transferencia.TransferenciaEntrada(categoria);
                        var lancamentoSaida = transferencia.TransferenciaSaida(categoria);
                        
                        lancamentoEntrada.Nome = "PAGAMENTO DE FATURA: " + _faturaCreditoResumo.ContaCredito;
                        lancamentoEntrada.Movimentos.Single().Historico = lancamentoEntrada.Nome;
                        
                        lancamentoSaida.Nome = "PAGAMENTO DE FATURA: " + _faturaCreditoResumo.ContaCredito;
                        lancamentoSaida.Movimentos.Single().Historico = lancamentoSaida.Nome;
                        var l = lancamentoEntrada;

                        var fatura = new FaturaCredito
                        {
                            ContaCredito = _faturaCreditoResumo.ContaCredito,
                            Mes = _faturaCreditoResumo.Mes,
                            Ano = _faturaCreditoResumo.Ano,
                            Valor = _faturaCreditoResumo.Saldo,
                            LancamentoPagamento = l
                        };

                        _context.Lancamentos.Add(lancamentoEntrada);
                        _context.Lancamentos.Add(lancamentoSaida);
                        _context.Transferencias.Add(transferencia);

                        _context.FaturasCredito.Add(fatura);
                        _context.SaveChanges();
                        SendMessage("Quitado com sucesso");
                        RaiseFinished();
                    }
                   

                },()=> ContaRemetente != null);
            }
        }

    }
}
